{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "'''\n",
    "【课程1.2】  Numpy基础数据结构\n",
    "\n",
    "NumPy数组是一个多维数组对象，称为ndarray。其由两部分组成：\n",
    "① 实际的数据\n",
    "② 描述这些数据的元数据\n",
    "\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1 2 3 4 5 6 7]\n",
      "1\n",
      "(7,)\n",
      "7\n",
      "int32\n",
      "4\n",
      "<memory at 0x0000000005927108>\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([1, 2, 3, 4, 5, 6, 7])"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 多维数组ndarray\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "ar = np.array([1,2,3,4,5,6,7])\n",
    "print(ar)          # 输出数组，注意数组的格式：中括号，元素之间没有逗号（和列表区分）\n",
    "print(ar.ndim)     # 输出数组维度的个数（轴数），或者说“秩”，维度的数量也称rank\n",
    "print(ar.shape)    # 数组的维度，对于n行m列的数组，shape为（n，m）\n",
    "print(ar.size)     # 数组的元素总数，对于n行m列的数组，元素总数为n*m\n",
    "print(ar.dtype)    # 数组中元素的类型，类似type()（注意了，type()是函数，.dtype是方法）\n",
    "print(ar.itemsize) # 数组中每个元素的字节大小，int32l类型字节为4，float64的字节为8\n",
    "print(ar.data)     # 包含实际数组元素的缓冲区，由于一般通过数组的索引获取元素，所以通常不需要使用这个属性。\n",
    "ar   # 交互方式下输出，会有array(数组)\n",
    "\n",
    "# 数组的基本属性\n",
    "# ① 数组的维数称为秩（rank），一维数组的秩为1，二维数组的秩为2，以此类推\n",
    "# ② 在NumPy中，每一个线性的数组称为是一个轴（axes），秩其实是描述轴的数量：\n",
    "# 比如说，二维数组相当于是两个一维数组，其中第一个一维数组中每个元素又是一个一维数组\n",
    "# 所以一维数组就是NumPy中的轴（axes），第一个轴相当于是底层数组，第二个轴是底层数组里的数组。\n",
    "# 而轴的数量——秩，就是数组的维数。 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0 1 2 3 4 5 6 7 8 9] <class 'numpy.ndarray'> int32\n",
      "[ 1.    2.    3.14  4.    5.  ] <class 'numpy.ndarray'> float64\n",
      "[['1' '2' '3']\n",
      " ['a' 'b' 'c']] (2, 3) 2 6\n",
      "[[1, 2, 3] ('a', 'b', 'c', 'd')] (2,) 1 2\n"
     ]
    }
   ],
   "source": [
    "# 创建数组：array()函数，括号内可以是列表、元祖、数组、生成器等\n",
    "\n",
    "ar1 = np.array(range(10))   # 整型\n",
    "ar2 = np.array([1,2,3.14,4,5])   # 浮点型\n",
    "ar3 = np.array([[1,2,3],('a','b','c')])   # 二维数组：嵌套序列（列表，元祖均可）\n",
    "ar4 = np.array([[1,2,3],('a','b','c','d')])   # 注意嵌套序列数量不一会怎么样\n",
    "print(ar1,type(ar1),ar1.dtype)\n",
    "print(ar2,type(ar2),ar2.dtype)\n",
    "print(ar3,ar3.shape,ar3.ndim,ar3.size)     # 二维数组，共6个元素\n",
    "print(ar4,ar4.shape,ar4.ndim,ar4.size)     # 一维数组，共2个元素"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0 1 2 3 4 5 6 7 8 9]\n",
      "[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.]\n",
      "[ 5  6  7  8  9 10 11]\n",
      "[  5.   7.   9.  11.]\n",
      "[   0    1    2 ..., 9997 9998 9999]\n"
     ]
    }
   ],
   "source": [
    "# 创建数组：arange()，类似range()，在给定间隔内返回均匀间隔的值。\n",
    "\n",
    "print(np.arange(10))    # 返回0-9，整型\n",
    "print(np.arange(10.0))  # 返回0.0-9.0，浮点型\n",
    "print(np.arange(5,12))  # 返回5-11\n",
    "print(np.arange(5.0,12,2))  # 返回5.0-12.0，步长为2\n",
    "print(np.arange(10000))  # 如果数组太大而无法打印，NumPy会自动跳过数组的中心部分，并只打印边角："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 2.    2.25  2.5   2.75  3.  ] <class 'numpy.ndarray'>\n",
      "[ 2.   2.2  2.4  2.6  2.8]\n",
      "(array([ 2.  ,  2.25,  2.5 ,  2.75,  3.  ]), 0.25) <class 'tuple'>\n"
     ]
    }
   ],
   "source": [
    "# 创建数组：linspace():返回在间隔[开始，停止]上计算的num个均匀间隔的样本。\n",
    "\n",
    "ar1 = np.linspace(2.0, 3.0, num=5)\n",
    "ar2 = np.linspace(2.0, 3.0, num=5, endpoint=False)\n",
    "ar3 = np.linspace(2.0, 3.0, num=5, retstep=True)\n",
    "print(ar1,type(ar1))\n",
    "print(ar2)\n",
    "print(ar3,type(ar3))\n",
    "# numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)\n",
    "# start：起始值，stop：结束值\n",
    "# num：生成样本数，默认为50\n",
    "# endpoint：如果为真，则停止是最后一个样本。否则，不包括在内。默认值为True。\n",
    "# retstep：如果为真，返回（样本，步骤），其中步长是样本之间的间距 → 输出为一个包含2个元素的元祖，第一个元素为array，第二个为步长实际值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0.  0.  0.  0.  0.] float64\n",
      "[[0 0]\n",
      " [0 0]] int32\n",
      "------\n",
      "[[0 1 2 3 4]\n",
      " [5 6 7 8 9]]\n",
      "[[0 0 0 0 0]\n",
      " [0 0 0 0 0]]\n",
      "------\n",
      "[ 1.  1.  1.  1.  1.  1.  1.  1.  1.]\n",
      "[[[ 1.  1.  1.  1.]\n",
      "  [ 1.  1.  1.  1.]\n",
      "  [ 1.  1.  1.  1.]]\n",
      "\n",
      " [[ 1.  1.  1.  1.]\n",
      "  [ 1.  1.  1.  1.]\n",
      "  [ 1.  1.  1.  1.]]]\n",
      "[[1 1 1 1 1]\n",
      " [1 1 1 1 1]]\n"
     ]
    }
   ],
   "source": [
    "# 创建数组：zeros()/zeros_like()/ones()/ones_like()\n",
    "\n",
    "ar1 = np.zeros(5)  \n",
    "ar2 = np.zeros((2,2), dtype = np.int)\n",
    "print(ar1,ar1.dtype)\n",
    "print(ar2,ar2.dtype)\n",
    "print('------')\n",
    "# numpy.zeros(shape, dtype=float, order='C'):返回给定形状和类型的新数组，用零填充。\n",
    "# shape：数组纬度，二维以上需要用()，且输入参数为整数\n",
    "# dtype：数据类型，默认numpy.float64\n",
    "# order：是否在存储器中以C或Fortran连续（按行或列方式）存储多维数据。\n",
    "\n",
    "ar3 = np.array([list(range(5)),list(range(5,10))])\n",
    "ar4 = np.zeros_like(ar3)\n",
    "print(ar3)\n",
    "print(ar4)\n",
    "print('------')\n",
    "# 返回具有与给定数组相同的形状和类型的零数组，这里ar4根据ar3的形状和dtype创建一个全0的数组\n",
    "\n",
    "ar5 = np.ones(9)\n",
    "ar6 = np.ones((2,3,4))\n",
    "ar7 = np.ones_like(ar3)\n",
    "print(ar5)\n",
    "print(ar6)\n",
    "print(ar7)\n",
    "# ones()/ones_like()和zeros()/zeros_like()一样，只是填充为1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 1.  0.  0.  0.  0.]\n",
      " [ 0.  1.  0.  0.  0.]\n",
      " [ 0.  0.  1.  0.  0.]\n",
      " [ 0.  0.  0.  1.  0.]\n",
      " [ 0.  0.  0.  0.  1.]]\n"
     ]
    }
   ],
   "source": [
    "# 创建数组：eye()\n",
    "\n",
    "print(np.eye(5))\n",
    "# 创建一个正方的N*N的单位矩阵，对角线值为1，其余为0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "ndarray的数据类型\n",
    "\n",
    "bool\t用一个字节存储的布尔类型（True或False）\n",
    "\n",
    "inti\t由所在平台决定其大小的整数（一般为int32或int64）\n",
    "\n",
    "int8\t一个字节大小，-128 至 127\n",
    "\n",
    "int16\t整数，-32768 至 32767\n",
    "\n",
    "int32\t整数，-2 ** 31 至 2 ** 32 -1\n",
    "\n",
    "int64\t整数，-2 ** 63 至 2 ** 63 - 1\n",
    "\n",
    "uint8\t无符号整数，0 至 255\n",
    "\n",
    "uint16\t无符号整数，0 至 65535\n",
    "\n",
    "uint32\t无符号整数，0 至 2 ** 32 - 1\n",
    "\n",
    "uint64\t无符号整数，0 至 2 ** 64 - 1\n",
    "\n",
    "float16\t半精度浮点数：16位，正负号1位，指数5位，精度10位\n",
    "\n",
    "float32\t单精度浮点数：32位，正负号1位，指数8位，精度23位\n",
    "\n",
    "float64或float\t双精度浮点数：64位，正负号1位，指数11位，精度52位\n",
    "\n",
    "complex64\t复数，分别用两个32位浮点数表示实部和虚部\n",
    "\n",
    "complex128或complex\t复数，分别用两个64位浮点数表示实部和虚部"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "######## 本节课有作业，请查看 “课程作业.docx”  ########"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "'''\n",
    "【课程1.3】  Numpy通用函数\n",
    "\n",
    "基本操作\n",
    "\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0 1 2 3 4 5 6 7 8 9] \n",
      " [0 1 2 3 4 5 6 7 8 9]\n",
      "[[ 1.  1.]\n",
      " [ 1.  1.]\n",
      " [ 1.  1.]\n",
      " [ 1.  1.]\n",
      " [ 1.  1.]] \n",
      " [[ 1.  1.  1.  1.  1.]\n",
      " [ 1.  1.  1.  1.  1.]]\n",
      "------\n",
      "[0 1 2 3 4 5 6 7 8 9] \n",
      " [[0 1 2 3 4]\n",
      " [5 6 7 8 9]]\n",
      "[[ 0.  0.  0.  0.  0.  0.  0.  0.]\n",
      " [ 0.  0.  0.  0.  0.  0.  0.  0.]\n",
      " [ 0.  0.  0.  0.  0.  0.  0.  0.]]\n",
      "[[ 0  1  2  3]\n",
      " [ 4  5  6  7]\n",
      " [ 8  9 10 11]]\n",
      "------\n",
      "[[0 1 2 3]\n",
      " [4 0 1 2]\n",
      " [3 4 0 1]]\n"
     ]
    }
   ],
   "source": [
    "# 数组形状：.T/.reshape()/.resize()\n",
    "\n",
    "ar1 = np.arange(10)\n",
    "ar2 = np.ones((5,2))\n",
    "print(ar1,'\\n',ar1.T)\n",
    "print(ar2,'\\n',ar2.T)\n",
    "print('------')\n",
    "# .T方法：转置，例如原shape为(3,4)/(2,3,4)，转置结果为(4,3)/(4,3,2) → 所以一维数组转置后结果不变\n",
    "\n",
    "ar3 = ar1.reshape(2,5)     # 用法1：直接将已有数组改变形状             \n",
    "ar4 = np.zeros((4,6)).reshape(3,8)   # 用法2：生成数组后直接改变形状\n",
    "ar5 = np.reshape(np.arange(12),(3,4))   # 用法3：参数内添加数组，目标形状\n",
    "print(ar1,'\\n',ar3)\n",
    "print(ar4)\n",
    "print(ar5)\n",
    "print('------')\n",
    "# numpy.reshape(a, newshape, order='C')：为数组提供新形状，而不更改其数据，所以元素数量需要一致！！\n",
    "\n",
    "ar6 = np.resize(np.arange(5),(3,4))\n",
    "print(ar6)\n",
    "# numpy.resize(a, new_shape)：返回具有指定形状的新数组，如有必要可重复填充所需数量的元素。\n",
    "# 注意了：.T/.reshape()/.resize()都是生成新的数组！！！"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\n",
      "[0 1 9 3 4 5 6 7 8 9] [0 1 9 3 4 5 6 7 8 9]\n",
      "False\n",
      "[9 1 9 3 4 5 6 7 8 9] [0 1 9 3 4 5 6 7 8 9]\n"
     ]
    }
   ],
   "source": [
    "# 数组的复制\n",
    "\n",
    "ar1 = np.arange(10)\n",
    "ar2 = ar1\n",
    "print(ar2 is ar1)\n",
    "ar1[2] = 9\n",
    "print(ar1,ar2)\n",
    "# 回忆python的赋值逻辑：指向内存中生成的一个值 → 这里ar1和ar2指向同一个值，所以ar1改变，ar2一起改变\n",
    "\n",
    "ar3 = ar1.copy()\n",
    "print(ar3 is ar1)\n",
    "ar1[0] = 9\n",
    "print(ar1,ar3)\n",
    "# copy方法生成数组及其数据的完整拷贝\n",
    "# 再次提醒：.T/.reshape()/.resize()都是生成新的数组！！！"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.] float64\n",
      "-----\n",
      "[0 1 2 3 4 5 6 7 8 9] int32\n",
      "[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.] float64\n"
     ]
    }
   ],
   "source": [
    "# 数组类型转换：.astype()\n",
    "\n",
    "ar1 = np.arange(10,dtype=float)\n",
    "print(ar1,ar1.dtype)\n",
    "print('-----')\n",
    "# 可以在参数位置设置数组类型\n",
    "\n",
    "ar2 = ar1.astype(np.int32)\n",
    "print(ar2,ar2.dtype)\n",
    "print(ar1,ar1.dtype)\n",
    "# a.astype()：转换数组类型\n",
    "# 注意：养成好习惯，数组类型用np.int32，而不是直接int32"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0 1 2 3 4] (5,)\n",
      "[5 6 7 8] (4,)\n",
      "[0 1 2 3 4 5 6 7 8] (9,)\n",
      "[[1]\n",
      " [2]\n",
      " [3]] (3, 1)\n",
      "[['a']\n",
      " ['b']\n",
      " ['c']] (3, 1)\n",
      "[['1' 'a']\n",
      " ['2' 'b']\n",
      " ['3' 'c']] (3, 2)\n",
      "-----\n",
      "[0 1 2 3 4] (5,)\n",
      "[5 6 7 8 9] (5,)\n",
      "[[0 1 2 3 4]\n",
      " [5 6 7 8 9]] (2, 5)\n",
      "[[1]\n",
      " [2]\n",
      " [3]] (3, 1)\n",
      "[['a']\n",
      " ['b']\n",
      " ['c']\n",
      " ['d']] (4, 1)\n",
      "[['1']\n",
      " ['2']\n",
      " ['3']\n",
      " ['a']\n",
      " ['b']\n",
      " ['c']\n",
      " ['d']] (7, 1)\n",
      "-----\n",
      "[0 1 2 3 4] (5,)\n",
      "[5 6 7 8 9] (5,)\n",
      "[[0 1 2 3 4]\n",
      " [5 6 7 8 9]] (2, 5)\n",
      "[[0 5]\n",
      " [1 6]\n",
      " [2 7]\n",
      " [3 8]\n",
      " [4 9]] (5, 2)\n"
     ]
    }
   ],
   "source": [
    "# 数组堆叠\n",
    "\n",
    "a = np.arange(5)    # a为一维数组，5个元素\n",
    "b = np.arange(5,9) # b为一维数组,4个元素\n",
    "ar1 = np.hstack((a,b))  # 注意:((a,b))，这里形状可以不一样\n",
    "print(a,a.shape)\n",
    "print(b,b.shape)\n",
    "print(ar1,ar1.shape)\n",
    "a = np.array([[1],[2],[3]])   # a为二维数组，3行1列\n",
    "b = np.array([['a'],['b'],['c']])  # b为二维数组，3行1列\n",
    "ar2 = np.hstack((a,b))  # 注意:((a,b))，这里形状必须一样\n",
    "print(a,a.shape)\n",
    "print(b,b.shape)\n",
    "print(ar2,ar2.shape)\n",
    "print('-----')\n",
    "# numpy.hstack(tup)：水平（按列顺序）堆叠数组\n",
    "\n",
    "a = np.arange(5)    \n",
    "b = np.arange(5,10)\n",
    "ar1 = np.vstack((a,b))\n",
    "print(a,a.shape)\n",
    "print(b,b.shape)\n",
    "print(ar1,ar1.shape)\n",
    "a = np.array([[1],[2],[3]])   \n",
    "b = np.array([['a'],['b'],['c'],['d']])   \n",
    "ar2 = np.vstack((a,b))  # 这里形状可以不一样\n",
    "print(a,a.shape)\n",
    "print(b,b.shape)\n",
    "print(ar2,ar2.shape)\n",
    "print('-----')\n",
    "# numpy.vstack(tup)：垂直（按列顺序）堆叠数组\n",
    "\n",
    "a = np.arange(5)    \n",
    "b = np.arange(5,10)\n",
    "ar1 = np.stack((a,b))\n",
    "ar2 = np.stack((a,b),axis = 1)\n",
    "print(a,a.shape)\n",
    "print(b,b.shape)\n",
    "print(ar1,ar1.shape)\n",
    "print(ar2,ar2.shape)\n",
    "# numpy.stack(arrays, axis=0)：沿着新轴连接数组的序列，形状必须一样！\n",
    "# 重点解释axis参数的意思，假设两个数组[1 2 3]和[4 5 6]，shape均为(3,0)\n",
    "# axis=0：[[1 2 3] [4 5 6]]，shape为(2,3)\n",
    "# axis=1：[[1 4] [2 5] [3 6]]，shape为(3,2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0  1  2  3]\n",
      " [ 4  5  6  7]\n",
      " [ 8  9 10 11]\n",
      " [12 13 14 15]]\n",
      "[array([[ 0,  1],\n",
      "       [ 4,  5],\n",
      "       [ 8,  9],\n",
      "       [12, 13]]), array([[ 2,  3],\n",
      "       [ 6,  7],\n",
      "       [10, 11],\n",
      "       [14, 15]])] <class 'list'>\n",
      "[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]]), array([[12, 13, 14, 15]])] <class 'list'>\n"
     ]
    }
   ],
   "source": [
    "# 数组拆分 \n",
    "\n",
    "ar = np.arange(16).reshape(4,4)\n",
    "ar1 = np.hsplit(ar,2)\n",
    "print(ar)\n",
    "print(ar1,type(ar1))\n",
    "# numpy.hsplit(ary, indices_or_sections)：将数组水平（逐列）拆分为多个子数组 → 按列拆分\n",
    "# 输出结果为列表，列表中元素为数组\n",
    "\n",
    "ar2 = np.vsplit(ar,4)\n",
    "print(ar2,type(ar2))\n",
    "# numpy.vsplit(ary, indices_or_sections)：:将数组垂直（行方向）拆分为多个子数组 → 按行拆"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[10 11 12]\n",
      " [13 14 15]]\n",
      "[[ 0  2  4]\n",
      " [ 6  8 10]]\n",
      "[[ 1.          0.5         0.33333333]\n",
      " [ 0.25        0.2         0.16666667]]\n",
      "[[ 0.          1.          1.41421356]\n",
      " [ 1.73205081  2.          2.23606798]]\n",
      "2.5\n",
      "5\n",
      "0\n",
      "1.70782512766\n",
      "2.91666666667\n",
      "15 [3 5 7]\n",
      "[1 2 3 4 5 6]\n"
     ]
    }
   ],
   "source": [
    "# 数组简单运算\n",
    "\n",
    "ar = np.arange(6).reshape(2,3)\n",
    "print(ar + 10)   # 加法\n",
    "print(ar * 2)   # 乘法\n",
    "print(1 / (ar+1))  # 除法\n",
    "print(ar ** 0.5)  # 幂\n",
    "# 与标量的运算\n",
    "\n",
    "print(ar.mean())  # 求平均值\n",
    "print(ar.max())  # 求最大值\n",
    "print(ar.min())  # 求最小值\n",
    "print(ar.std())  # 求标准差\n",
    "print(ar.var())  # 求方差\n",
    "print(ar.sum(), np.sum(ar,axis = 0))  # 求和，np.sum() → axis为0，按列求和；axis为1，按行求和\n",
    "print(np.sort(np.array([1,4,3,2,5,6])))  # 排序\n",
    "# 常用函数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "######## 本节课有作业，请查看 “课程作业.docx”  ########"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "'''\n",
    "【课程1.4】  Numpy索引及切片\n",
    "\n",
    "核心：基本索引及切片 / 布尔型索引及切片\n",
    "\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]\n",
      "4\n",
      "[3 4 5]\n",
      "-----\n",
      "[[ 0  1  2  3]\n",
      " [ 4  5  6  7]\n",
      " [ 8  9 10 11]\n",
      " [12 13 14 15]] 数组轴数为2\n",
      "[ 8  9 10 11] 数组轴数为1\n",
      "9\n",
      "[[ 4  5  6  7]\n",
      " [ 8  9 10 11]] 数组轴数为2\n",
      "10\n",
      "[[1 2 3]\n",
      " [5 6 7]]\n",
      "-----\n",
      "[[[0 1]\n",
      "  [2 3]]\n",
      "\n",
      " [[4 5]\n",
      "  [6 7]]] 数组轴数为3\n",
      "[[0 1]\n",
      " [2 3]] 数组轴数为2\n",
      "[0 1] 数组轴数为1\n",
      "1 数组轴数为0\n"
     ]
    }
   ],
   "source": [
    "# 基本索引及切片\n",
    "\n",
    "ar = np.arange(20)\n",
    "print(ar)\n",
    "print(ar[4])\n",
    "print(ar[3:6])\n",
    "print('-----')\n",
    "# 一维数组索引及切片\n",
    "\n",
    "ar = np.arange(16).reshape(4,4)\n",
    "print(ar, '数组轴数为%i' %ar.ndim)   # 4*4的数组\n",
    "print(ar[2],  '数组轴数为%i' %ar[2].ndim)  # 切片为下一维度的一个元素，所以是一维数组\n",
    "print(ar[2][1]) # 二次索引，得到一维数组中的一个值\n",
    "print(ar[1:3],  '数组轴数为%i' %ar[1:3].ndim)  # 切片为两个一维数组组成的二维数组\n",
    "print(ar[2,2])  # 切片数组中的第三行第三列 → 10\n",
    "print(ar[:2,1:])  # 切片数组中的1,2行、2,3,4列 → 二维数组\n",
    "print('-----')\n",
    "# 二维数组索引及切片\n",
    "\n",
    "ar = np.arange(8).reshape(2,2,2)\n",
    "print(ar, '数组轴数为%i' %ar.ndim)   # 2*2*2的数组\n",
    "print(ar[0],  '数组轴数为%i' %ar[0].ndim)  # 三维数组的下一个维度的第一个元素 → 一个二维数组\n",
    "print(ar[0][0],  '数组轴数为%i' %ar[0][0].ndim)  # 三维数组的下一个维度的第一个元素下的第一个元素 → 一个一维数组\n",
    "print(ar[0][0][1],  '数组轴数为%i' %ar[0][0][1].ndim)  \n",
    "# **三维数组索引及切片"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0  1  2  3]\n",
      " [ 4  5  6  7]\n",
      " [ 8  9 10 11]]\n",
      "[ True False  True]\n",
      "[ True  True False False]\n",
      "[[ 0  1  2  3]\n",
      " [ 8  9 10 11]]\n",
      "[[0 1]\n",
      " [4 5]\n",
      " [8 9]]\n",
      "[[False False False False]\n",
      " [False False  True  True]\n",
      " [ True  True  True  True]]\n",
      "[ 6  7  8  9 10 11]\n"
     ]
    }
   ],
   "source": [
    "# 布尔型索引及切片\n",
    "\n",
    "ar = np.arange(12).reshape(3,4)\n",
    "i = np.array([True,False,True])\n",
    "j = np.array([True,True,False,False])\n",
    "print(ar)\n",
    "print(i)\n",
    "print(j)\n",
    "print(ar[i,:])  # 在第一维度做判断，只保留True，这里第一维度就是行，ar[i,:] = ar[i]（简单书写格式）\n",
    "print(ar[:,j])  # 在第二维度做判断，这里如果ar[:,i]会有警告，因为i是3个元素，而ar在列上有4个\n",
    "# 布尔型索引：以布尔型的矩阵去做筛选\n",
    "\n",
    "m = ar > 5\n",
    "print(m)  # 这里m是一个判断矩阵\n",
    "print(ar[m])  # 用m判断矩阵去筛选ar数组中>5的元素 → 重点！后面的pandas判断方式原理就来自此处"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0 1 2 3 4 5 6 7 8 9]\n",
      "[  0   1   2   3   4 100   6 200 200   9]\n",
      "[0 1 2 3 4 5 6 7 8 9]\n",
      "[  0   1   2   3   4   5   6 200 200   9]\n"
     ]
    }
   ],
   "source": [
    "# 数组索引及切片的值更改、复制\n",
    "\n",
    "ar = np.arange(10)\n",
    "print(ar)\n",
    "ar[5] = 100\n",
    "ar[7:9] = 200\n",
    "print(ar)\n",
    "# 一个标量赋值给一个索引/切片时，会自动改变/传播原始数组\n",
    "\n",
    "ar = np.arange(10)\n",
    "b = ar.copy()\n",
    "b[7:9] = 200\n",
    "print(ar)\n",
    "print(b)\n",
    "# 复制"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "######## 本节课有作业，请查看 “课程作业.docx”  ########"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "'''\n",
    "【课程1.5】  Numpy随机数\n",
    "\n",
    "numpy.random包含多种概率分布的随机样本，是数据分析辅助的重点工具之一\n",
    "\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.17875618 -1.19367146 -1.29127688  1.11541622]\n",
      " [ 1.48126355 -0.81119863 -0.94187702 -0.13203948]\n",
      " [ 0.11418808 -2.34415548  0.17391121  1.4822019 ]\n",
      " [ 0.46157021  0.43227682  0.58489093  0.74553395]]\n"
     ]
    }
   ],
   "source": [
    "# 随机数生成\n",
    "\n",
    "samples = np.random.normal(size=(4,4))\n",
    "print(samples)\n",
    "# 生成一个标准正太分布的4*4样本值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.3671245126484347 <class 'float'>\n",
      "[ 0.95365841  0.45627035  0.71528562  0.98488116] <class 'numpy.ndarray'>\n",
      "[[ 0.82284657  0.95853197  0.87376954]\n",
      " [ 0.53341526  0.17313861  0.18831533]] <class 'numpy.ndarray'>\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x7bb52e8>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nERGRaP8HPyLaK+bpsZcAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x595b160>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# numpy.random.rand(d0, d1, ..., dn)：生成一个[0,1)之间的随机浮点数或N维浮点数组 —— 均匀分布\n",
    "\n",
    "import matplotlib.pyplot as plt  # 导入matplotlib模块，用于图表辅助分析\n",
    "% matplotlib inline \n",
    "# 魔法函数，每次运行自动生成图表\n",
    "\n",
    "a = np.random.rand()\n",
    "print(a,type(a))  # 生成一个随机浮点数\n",
    "\n",
    "b = np.random.rand(4)\n",
    "print(b,type(b))  # 生成形状为4的一维数组\n",
    "\n",
    "c = np.random.rand(2,3)\n",
    "print(c,type(c))  # 生成形状为2*3的二维数组，注意这里不是((2,3))\n",
    "\n",
    "samples1 = np.random.rand(1000)\n",
    "samples2 = np.random.rand(1000)\n",
    "plt.scatter(samples1,samples2)\n",
    "# 生成1000个均匀分布的样本值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x842ea90>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\npwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x591ee10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#  numpy.random.randn(d0, d1, ..., dn)：生成一个浮点数或N维浮点数组 —— 正态分布\n",
    "\n",
    "samples1 = np.random.randn(1000)\n",
    "samples2 = np.random.randn(1000)\n",
    "plt.scatter(samples1,samples2)\n",
    "# randn和rand的参数用法一样\n",
    "# 生成1000个正太的样本值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "[0 1 1 0 1]\n",
      "[2 5 2 3 5]\n",
      "[[0 1 1]\n",
      " [1 1 1]]\n",
      "[[4 4 3]\n",
      " [2 3 3]]\n"
     ]
    }
   ],
   "source": [
    "# numpy.random.randint(low, high=None, size=None, dtype='l')：生成一个整数或N维整数数组\n",
    "# 若high不为None时，取[low,high)之间随机整数，否则取值[0,low)之间随机整数，且high必须大于low \n",
    "# dtype参数：只能是int类型  \n",
    "\n",
    "print(np.random.randint(2))\n",
    "# low=2：生成1个[0,2)之间随机整数  \n",
    "\n",
    "print(np.random.randint(2,size=5))\n",
    "# low=2,size=5 ：生成5个[0,2)之间随机整数\n",
    "\n",
    "print(np.random.randint(2,6,size=5))\n",
    "# low=2,high=6,size=5：生成5个[2,6)之间随机整数  \n",
    "\n",
    "print(np.random.randint(2,size=(2,3)))\n",
    "# low=2,size=(2,3)：生成一个2x3整数数组,取数范围：[0,2)随机整数 \n",
    "\n",
    "print(np.random.randint(2,6,(2,3)))\n",
    "# low=2,high=6,size=(2,3)：生成一个2*3整数数组,取值范围：[2,6)随机整数  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "######## 本节课有作业，请查看 “课程作业.docx”  ########"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "'''\n",
    "【课程1.6】  Numpy数据的输入输出\n",
    "\n",
    "numpy读取/写入数组数据、文本数据\n",
    "\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.57358458  0.71126411  0.22317828  0.69640773  0.97406015]\n",
      " [ 0.83007851  0.63460575  0.37424462  0.49711017  0.42822812]\n",
      " [ 0.51354459  0.96671598  0.21427951  0.91429226  0.00393325]\n",
      " [ 0.680534    0.31516091  0.79848663  0.35308657  0.21576843]\n",
      " [ 0.38634472  0.47153005  0.6457086   0.94983697  0.97670458]]\n"
     ]
    }
   ],
   "source": [
    "# 存储数组数据 .npy文件\n",
    "\n",
    "import os\n",
    "os.chdir('C:/Users/Hjx/Desktop/')\n",
    "\n",
    "ar = np.random.rand(5,5)\n",
    "print(ar)\n",
    "np.save('arraydata.npy', ar)\n",
    "# 也可以直接 np.save('C:/Users/Hjx/Desktop/arraydata.npy', ar)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.57358458  0.71126411  0.22317828  0.69640773  0.97406015]\n",
      " [ 0.83007851  0.63460575  0.37424462  0.49711017  0.42822812]\n",
      " [ 0.51354459  0.96671598  0.21427951  0.91429226  0.00393325]\n",
      " [ 0.680534    0.31516091  0.79848663  0.35308657  0.21576843]\n",
      " [ 0.38634472  0.47153005  0.6457086   0.94983697  0.97670458]]\n"
     ]
    }
   ],
   "source": [
    "# 读取数组数据 .npy文件\n",
    "\n",
    "ar_load =np.load('arraydata.npy')\n",
    "print(ar_load)\n",
    "# 也可以直接 np.load('C:/Users/Hjx/Desktop/arraydata.npy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.28280684  0.66188985  0.00372083  0.54051044  0.68553963]\n",
      " [ 0.9138449   0.37056825  0.62813711  0.83032184  0.70196173]\n",
      " [ 0.63438739  0.86552157  0.68294764  0.2959724   0.62337767]\n",
      " [ 0.67411154  0.87678919  0.53732168  0.90366896  0.70480366]\n",
      " [ 0.00936579  0.32914898  0.30001813  0.66198967  0.04336824]]\n"
     ]
    }
   ],
   "source": [
    "# 存储/读取文本文件\n",
    "\n",
    "ar = np.random.rand(5,5)\n",
    "np.savetxt('array.txt',ar, delimiter=',')\n",
    "# np.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\\n', header='', footer='', comments='# ')：存储为文本txt文件\n",
    "\n",
    "ar_loadtxt = np.loadtxt('array.txt', delimiter=',')\n",
    "print(ar_loadtxt)\n",
    "# 也可以直接 np.loadtxt('C:/Users/Hjx/Desktop/array.txt')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "######## 本节课有作业，请查看 “课程作业.docx”  ########"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
